export function isFunction (val) {
  return typeof val === 'function'
}
export function isPlainObject (val) {
  return val !== null && typeof val === 'object' && !Array.isArray(val)
}
export function isPromise (val) {
  return isPlainObject(val) && isFunction(val.then) && isFunction(val.catch)
}
export function isDef (value) {
  return value !== undefined && value !== null
}
export function isObj (x) {
  const type = typeof x
  return x !== null && (type === 'object' || type === 'function')
}
export function isNumber (value) {
  return /^\d+(\.\d+)?$/.test(value)
}
export function isBoolean (value) {
  return typeof value === 'boolean'
}
const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i
const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv)/i
export function isImageUrl (url) {
  return IMAGE_REGEXP.test(url)
}
export function isVideoUrl (url) {
  return VIDEO_REGEXP.test(url)
}

export function validateAttributes (data, options, errors) {
  let hasError = false
  for (let attribute in data) {
    if (Object.prototype.hasOwnProperty.call(options, attribute)) {
      let fieldRule = options[attribute]
      if (validateAttribute(fieldRule, attribute, data)) {
        fieldRule.error = false
        fieldRule.errorMessage = ''
        errors[attribute] = ''
      } else {
        fieldRule.error = true
        errors[attribute] = fieldRule.errorMessage
        hasError = true
        break
      }
    }
  }
  return !hasError
}
export function validateAttribute (rule, name, data) {
  const attributeData = data[name]
  if (rule.required && !attributeData) {
    return false
  } else if (rule.callback) {
    const validated = rule.callback(attributeData, data)
    return validated
  } else {
    return true
  }
}
